package fr.afcepf.atod16.groupe1.projet1.dao.catalogue;

import fr.afcepf.atod16.groupe1.projet1.dao.DaoAbstract;
import fr.afcepf.atod16.groupe1.projet1.dto.catalogue.DtoFicheProduit;
import fr.afcepf.atod16.groupe1.projet1.dto.util.DtoProduitVignette;
import fr.afcepf.atod16.groupe1.projet1.entities.catalogue.FicheProduit;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 * Implementation de la DAO fiches produits avec JPA
 * @author cedric
 */
@Stateless
public class DaoFicheProduitJpa extends DaoAbstract<FicheProduit, DtoFicheProduit> implements DaoFicheProduit {

    @PersistenceContext(unitName = "projet1c-ejbPU")
    private EntityManager em;

    /**
     * Surcharge la fonction de récupération de l'entityManager car le contexte
     * de persistance est injecté dans la classe.
     * @return L'entityManager
     */
    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    /**
     * Constructeur fournissant à la superclasse l'objet Class de l'entité
     */
    public DaoFicheProduitJpa() {
        super(FicheProduit.class);
    }

    /**
     * {@inheritDoc} 
     */
    @Override
    public List<DtoProduitVignette> rechercherParNom(String nom) {
        throw new UnsupportedOperationException("Not supported yet.");
        /*Query query = getEntityManager().createQuery("SELECT f FROM FicheProduit f WHERE f.valide = true AND (f.nom) LIKE :keyword");
        query.setParameter("keyword", nom);
        List<FicheProduit> fiches = query.getResultList();
        List<DtoProduitVignette> vignettes = new ArrayList<DtoProduitVignette>();
        DtoProduitVignette vignette;
        for(FicheProduit fiche : fiches) {
            vignette = new DtoProduitVignette();
            vignette.setNom(fiche.getNom());
            vignette.setResume(fiche.getResume());
            vignettes.add(vignette);
        }
        return vignettes;*/
    }

    /**
     * {@inheritDoc} 
     */
    @Override
    public List<DtoProduitVignette> getSelection(Integer nombre) {
        Query query = getEntityManager().createQuery("SELECT f FROM FicheProduit f WHERE f.valide = :valide ORDER BY f.dateCreation DESC");
        query.setParameter("valide", (Boolean) true);
        query.setMaxResults(nombre);
        List<FicheProduit> fiches = query.getResultList();
        List<DtoProduitVignette> vignettes = new ArrayList<DtoProduitVignette>();
        DtoProduitVignette vignette;
        for(FicheProduit fiche : fiches) {
            vignette = new DtoProduitVignette();
            vignette.setId(fiche.getId());
            vignette.setNom(fiche.getNom());
            vignette.setPrix(fiche.getProduit().getPrix());
            vignette.setResume(fiche.getResume());
            vignette.setStock(fiche.getProduit().getStock());
            if(!fiche.getPhotos().isEmpty()){
                 vignette.setVignette(fiche.getPhotos().get(0).getVignette());
            }else{
                vignette.setVignette("/resources/img/imgvignette.jpg");
            }
            vignettes.add(vignette);
        }
        return vignettes;
    }

    /**
     * {@inheritDoc} 
     */
    @Override
    public List<DtoProduitVignette> getSelection(Integer categorie, Integer nombre) {
        Query query = getEntityManager().createQuery("SELECT DISTINCT f "
                + "FROM FicheProduit f "
                + "JOIN f.sousCategories s "
                + "JOIN s.categorie c "
                + "WHERE f.valide = :valide AND "
                + "c.id = :idCategorie "
                + "ORDER BY f.dateCreation DESC");
        query.setParameter("valide", (Boolean) true);
        query.setParameter("idCategorie", categorie);
        query.setMaxResults(nombre);
        Iterator<FicheProduit> fiches = query.getResultList().iterator();
        List<DtoProduitVignette> vignettes = new ArrayList<DtoProduitVignette>();
        DtoProduitVignette vignette;
        FicheProduit fiche;
        while(fiches.hasNext()){
            fiche = fiches.next();
            vignette = new DtoProduitVignette();
            vignette.setId(fiche.getId());
            vignette.setNom(fiche.getNom());
            vignette.setPrix(fiche.getProduit().getPrix());
            vignette.setResume(fiche.getResume());
            vignette.setStock(fiche.getProduit().getStock());
            if(!fiche.getPhotos().isEmpty()){
                 vignette.setVignette(fiche.getPhotos().get(0).getVignette());
            }else{
                vignette.setVignette("/resources/img/imgvignette.jpg");
            }
            vignettes.add(vignette);
        }
        return vignettes;
    }

    /**
     * {@inheritDoc} 
     */
    @Override
    public List<DtoProduitVignette> getSelectionPromo(Integer nombre) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     * {@inheritDoc} 
     */
    @Override
    public List<DtoProduitVignette> getSelectionpromo(Integer categorie, Integer nombre) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     * {@inheritDoc} 
     */
    @Override
    public List<DtoProduitVignette> getListProduit(Integer sousCategorie) {
        Query query = getEntityManager().createQuery("SELECT DISTINCT f "
                + "FROM FicheProduit f "
                + "JOIN f.sousCategories s "
                + "WHERE f.valide = :valide AND "
                + "s.id = :idSousCategorie "
                + "ORDER BY f.dateCreation DESC");
        query.setParameter("valide", (Boolean) true);
        query.setParameter("idSousCategorie", sousCategorie);
        Iterator<FicheProduit> fiches = query.getResultList().iterator();
        List<DtoProduitVignette> vignettes = new ArrayList<DtoProduitVignette>();
        DtoProduitVignette vignette;
        FicheProduit fiche;
        while(fiches.hasNext()){
            fiche = fiches.next();
            vignette = new DtoProduitVignette();
            vignette.setId(fiche.getId());
            vignette.setNom(fiche.getNom());
            vignette.setPrix(fiche.getProduit().getPrix());
            vignette.setResume(fiche.getResume());
            vignette.setStock(fiche.getProduit().getStock());
            if(!fiche.getPhotos().isEmpty()){
                 vignette.setVignette(fiche.getPhotos().get(0).getVignette());
            }else{
                vignette.setVignette("/resources/img/imgvignette.jpg");
            }
            vignettes.add(vignette);
        }
        return vignettes;
    }
}
